Skip to content

IO.流

1、基础知识

参考: https://javaguide.cn/java/io/io-basis.html

IO 指的是输入和输出(主体是计算机内存)

  • 输入: 数据输入到计算机内存
  • 输出:从计算机内存输出到外部设备

了解 Java IO 流,需要知道四个基本的抽象类基类:

  • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

常用方法建议直接看一下 API 方法

IO

  • 字节流
    • InputStream 字节输入流
    • OutputStream 字节输出流
  • 字符流
    • Reader
    • Writer
  • 字节缓冲流
    • BufferedInputStream(字节缓冲输入流)
    • BufferedOutputStream(字节缓冲输出流)
  • 字符缓冲流
  • 打印流
  • 随机访问流

一般来说,我们是建议如果读取文字的时候使用字符流,字符流默认采用的是 Unicode 编码,因此不会出现很明显的输入和输出编码不一致的情况;

对于音频、图片等建议使用字节流。

记录一个面试题

常用字符编码所占字节数?>

utf8 :英文占 1 字节,中文占 3 字节,unicode:任何字符都占 2 个字节,gbk:英文占 1 字节,中文占 2 字节

2、缓冲流

BufferedInputStream(字节缓冲输入流)

BufferedInputStream 从源头(通常是文件)读取数据(字节信息)到内存的过程中不会一个字节一个字节的读取,而是会先将读取到的字节存放在缓存区,并从内部缓冲区中单独读取字节。这样大幅减少了 IO 次数,提高了读取效率。

BufferedInputStream 内部维护了一个缓冲区,这个缓冲区实际就是一个字节数组,通过阅读 BufferedInputStream 源码即可得到这个结论。

public
class BufferedInputStream extends FilterInputStream {
    // 内部缓冲区数组
    protected volatile byte buf[];
    // 缓冲区的默认大小
    private static int DEFAULT_BUFFER_SIZE = 8192;
    // 使用默认的缓冲区大小
    public BufferedInputStream(InputStream in) {
        this(in, DEFAULT_BUFFER_SIZE);
    }
    // 自定义缓冲区大小
    public BufferedInputStream(InputStream in, int size) {
        super(in);
        if (size <= 0) {
            throw new IllegalArgumentException("Buffer size <= 0");
        }
        buf = new byte[size];
    }
}

缓冲区的大小默认为 8192 字节,当然,你也可以通过 BufferedInputStream(InputStream in, int size) 这个构造方法来指定缓冲区的大小。

3、IO 设计模式

to be contined...

4、NIO

IO 模型

UNIX 系统下, IO 模型一共有 5 种:同步阻塞 I/O同步非阻塞 I/OI/O 多路复用信号驱动 I/O 和异步 I/O

参考: Java IO 模型详解 | JavaGuide

Java 中 3 种常见 IO 模型

  • NIO
  • BIO
  • AIO

NIO详解

to be contined...